fix(context): 修复达到最大轮数后续跑上下文丢失问题#290
Conversation
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
| @@ -71,7 +71,21 @@ func (s *Service) Run(ctx context.Context, input UserInput) error { | |||
| for turn := 0; ; turn++ { | |||
| maxLoops := resolveMaxLoops(s.configManager.Get()) | |||
| if turn >= maxLoops { | |||
There was a problem hiding this comment.
非阻塞建议:这里在命中 max_loops 时无条件尝试 loop_limit compact checkpoint。该行为与本 PR 目标一致,但会把“退出路径”变成潜在重操作路径(额外 compact + 持久化)。如果后续观察到高频 max_loops 场景的尾延迟上升,可考虑增加一个轻量开关(例如仅在 continue 语义输入或配置显式开启时执行 checkpoint)。
|
@Yumiue 我觉得这里的 max_steps 没有太强的必要性,尤其对于长时间运行的 agent 来说,它更像是一个框架层的人工中断,而不是任务本身的自然终止条件。 一个任务需要多少步,通常取决于问题复杂度、工具调用粒度和中间状态设计,而不是一个预先设定的固定数字。所以把 agent 在第 N 步强行停掉,很多时候并不代表它进入了异常状态,只是说明任务还没做完。 如果这里的目的是防止上下文无限膨胀,那更合理的手段应该是压缩 / summarization / checkpoint,而不是 max_steps。如果压缩链路是可信的,agent 应该可以持续工作;如果压缩链路不可信,那我们需要修的是压缩能力本身,而不是引入一个步数上限来掩盖问题。 我更建议去掉这个限制,或者至少不要把它作为核心终止条件。相比 max_steps,更值得保留的是这些 guardrail:
这些约束和真实失败模式更相关,也不会无谓地阻碍长任务执行。 |
|
@xgopilot 帮我上面的评论创建一个issue,并派发给 @Yumiue 修复。 |
处理结果已根据你上面的评论创建 issue,并已指派给
未执行项:未做代码修改(本次需求仅为创建并派发 issue)。 |
背景
源码分析类任务在连续多轮执行后,存在两类续跑不稳问题:
read_file结果会在未触发 compact 前先被裁掉。max_loops退出时,runtime 直接报错结束,未先沉淀 durableTaskState + compact summary,导致后续输入“继续”时主要依赖最近消息窗口。本次修改
context.compact.read_time_max_message_spans配置项,并提供默认值24loop_limitruntime.Run()命中max_loops前,best-effort 执行一次loop_limitcontinuation checkpointsession.Messagessession.TaskStatecompact_start / compact_doneloop_limit成功与失败分支的 runtime 测试影响
auto_compact默认关闭的现状filesystem_read_file的 micro compact 策略,行为面保持最小验证
go test ./internal/runtimego test ./internal/config ./internal/contextgo test ./...